package com.hmall.order.interceptor;



import com.hmall.common.context.BaseContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@Component
@Slf4j
public class JwtTokenOrderInterceptor implements HandlerInterceptor {
    /**
     * 校验JWT令牌
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        try {
            //判断当前拦截到的是Controller的方法还是其他的资源
            if (!(handler instanceof HandlerMethod)){
                //当前拦截到的不是动态方法，直接放行
                return true;
            }
            //获取请求头的令牌数据
            String token = request.getHeader("authorization");
            System.out.println(token);
            //将用户id存储到ThreadLocal
            BaseContext.setCurrentId(Long.valueOf(token));
            //如果有登录数据，代表已经登录，放行
            return true;
        } catch (Exception e) {
            //否则，发送未认证错误信息
            response.setStatus(401);
            return false;
        }
    }

    //业务完成，将BaseContext中用户Id删除
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        BaseContext.removeCurrentId();
    }
}
